/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controlador;

import controlador.exceptions.IllegalOrphanException;
import controlador.exceptions.NonexistentEntityException;
import entidad.Empleados;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import entidad.Sucursales;
import entidad.Puestos;
import entidad.Pagossueldos;
import java.util.ArrayList;
import java.util.Collection;
import entidad.Usuarios;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

/**
 *
 * @author a
 */
public class EmpleadosJpaController implements Serializable {

    public EmpleadosJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Empleados empleados) {
        if (empleados.getPagossueldosCollection() == null) {
            empleados.setPagossueldosCollection(new ArrayList<Pagossueldos>());
        }
        if (empleados.getUsuariosCollection() == null) {
            empleados.setUsuariosCollection(new ArrayList<Usuarios>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Sucursales sucursalidSucursal = empleados.getSucursalidSucursal();
            if (sucursalidSucursal != null) {
                sucursalidSucursal = em.getReference(sucursalidSucursal.getClass(), sucursalidSucursal.getIdSucursales());
                empleados.setSucursalidSucursal(sucursalidSucursal);
            }
            Puestos puestoidPuesto = empleados.getPuestoidPuesto();
            if (puestoidPuesto != null) {
                puestoidPuesto = em.getReference(puestoidPuesto.getClass(), puestoidPuesto.getIdPuestos());
                empleados.setPuestoidPuesto(puestoidPuesto);
            }
            Collection<Pagossueldos> attachedPagossueldosCollection = new ArrayList<Pagossueldos>();
            for (Pagossueldos pagossueldosCollectionPagossueldosToAttach : empleados.getPagossueldosCollection()) {
                pagossueldosCollectionPagossueldosToAttach = em.getReference(pagossueldosCollectionPagossueldosToAttach.getClass(), pagossueldosCollectionPagossueldosToAttach.getIdPagosSueldos());
                attachedPagossueldosCollection.add(pagossueldosCollectionPagossueldosToAttach);
            }
            empleados.setPagossueldosCollection(attachedPagossueldosCollection);
            Collection<Usuarios> attachedUsuariosCollection = new ArrayList<Usuarios>();
            for (Usuarios usuariosCollectionUsuariosToAttach : empleados.getUsuariosCollection()) {
                usuariosCollectionUsuariosToAttach = em.getReference(usuariosCollectionUsuariosToAttach.getClass(), usuariosCollectionUsuariosToAttach.getIdUsuarios());
                attachedUsuariosCollection.add(usuariosCollectionUsuariosToAttach);
            }
            empleados.setUsuariosCollection(attachedUsuariosCollection);
            em.persist(empleados);
            if (sucursalidSucursal != null) {
                sucursalidSucursal.getEmpleadosCollection().add(empleados);
                sucursalidSucursal = em.merge(sucursalidSucursal);
            }
            if (puestoidPuesto != null) {
                puestoidPuesto.getEmpleadosCollection().add(empleados);
                puestoidPuesto = em.merge(puestoidPuesto);
            }
            for (Pagossueldos pagossueldosCollectionPagossueldos : empleados.getPagossueldosCollection()) {
                Empleados oldEmpleadosidEmpleadosOfPagossueldosCollectionPagossueldos = pagossueldosCollectionPagossueldos.getEmpleadosidEmpleados();
                pagossueldosCollectionPagossueldos.setEmpleadosidEmpleados(empleados);
                pagossueldosCollectionPagossueldos = em.merge(pagossueldosCollectionPagossueldos);
                if (oldEmpleadosidEmpleadosOfPagossueldosCollectionPagossueldos != null) {
                    oldEmpleadosidEmpleadosOfPagossueldosCollectionPagossueldos.getPagossueldosCollection().remove(pagossueldosCollectionPagossueldos);
                    oldEmpleadosidEmpleadosOfPagossueldosCollectionPagossueldos = em.merge(oldEmpleadosidEmpleadosOfPagossueldosCollectionPagossueldos);
                }
            }
            for (Usuarios usuariosCollectionUsuarios : empleados.getUsuariosCollection()) {
                Empleados oldEmpleadoidEmpleadoOfUsuariosCollectionUsuarios = usuariosCollectionUsuarios.getEmpleadoidEmpleado();
                usuariosCollectionUsuarios.setEmpleadoidEmpleado(empleados);
                usuariosCollectionUsuarios = em.merge(usuariosCollectionUsuarios);
                if (oldEmpleadoidEmpleadoOfUsuariosCollectionUsuarios != null) {
                    oldEmpleadoidEmpleadoOfUsuariosCollectionUsuarios.getUsuariosCollection().remove(usuariosCollectionUsuarios);
                    oldEmpleadoidEmpleadoOfUsuariosCollectionUsuarios = em.merge(oldEmpleadoidEmpleadoOfUsuariosCollectionUsuarios);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Empleados empleados) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Empleados persistentEmpleados = em.find(Empleados.class, empleados.getIdEmpleados());
            Sucursales sucursalidSucursalOld = persistentEmpleados.getSucursalidSucursal();
            Sucursales sucursalidSucursalNew = empleados.getSucursalidSucursal();
            Puestos puestoidPuestoOld = persistentEmpleados.getPuestoidPuesto();
            Puestos puestoidPuestoNew = empleados.getPuestoidPuesto();
            Collection<Pagossueldos> pagossueldosCollectionOld = persistentEmpleados.getPagossueldosCollection();
            Collection<Pagossueldos> pagossueldosCollectionNew = empleados.getPagossueldosCollection();
            Collection<Usuarios> usuariosCollectionOld = persistentEmpleados.getUsuariosCollection();
            Collection<Usuarios> usuariosCollectionNew = empleados.getUsuariosCollection();
            List<String> illegalOrphanMessages = null;
            for (Pagossueldos pagossueldosCollectionOldPagossueldos : pagossueldosCollectionOld) {
                if (!pagossueldosCollectionNew.contains(pagossueldosCollectionOldPagossueldos)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Pagossueldos " + pagossueldosCollectionOldPagossueldos + " since its empleadosidEmpleados field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (sucursalidSucursalNew != null) {
                sucursalidSucursalNew = em.getReference(sucursalidSucursalNew.getClass(), sucursalidSucursalNew.getIdSucursales());
                empleados.setSucursalidSucursal(sucursalidSucursalNew);
            }
            if (puestoidPuestoNew != null) {
                puestoidPuestoNew = em.getReference(puestoidPuestoNew.getClass(), puestoidPuestoNew.getIdPuestos());
                empleados.setPuestoidPuesto(puestoidPuestoNew);
            }
            Collection<Pagossueldos> attachedPagossueldosCollectionNew = new ArrayList<Pagossueldos>();
            for (Pagossueldos pagossueldosCollectionNewPagossueldosToAttach : pagossueldosCollectionNew) {
                pagossueldosCollectionNewPagossueldosToAttach = em.getReference(pagossueldosCollectionNewPagossueldosToAttach.getClass(), pagossueldosCollectionNewPagossueldosToAttach.getIdPagosSueldos());
                attachedPagossueldosCollectionNew.add(pagossueldosCollectionNewPagossueldosToAttach);
            }
            pagossueldosCollectionNew = attachedPagossueldosCollectionNew;
            empleados.setPagossueldosCollection(pagossueldosCollectionNew);
            Collection<Usuarios> attachedUsuariosCollectionNew = new ArrayList<Usuarios>();
            for (Usuarios usuariosCollectionNewUsuariosToAttach : usuariosCollectionNew) {
                usuariosCollectionNewUsuariosToAttach = em.getReference(usuariosCollectionNewUsuariosToAttach.getClass(), usuariosCollectionNewUsuariosToAttach.getIdUsuarios());
                attachedUsuariosCollectionNew.add(usuariosCollectionNewUsuariosToAttach);
            }
            usuariosCollectionNew = attachedUsuariosCollectionNew;
            empleados.setUsuariosCollection(usuariosCollectionNew);
            empleados = em.merge(empleados);
            if (sucursalidSucursalOld != null && !sucursalidSucursalOld.equals(sucursalidSucursalNew)) {
                sucursalidSucursalOld.getEmpleadosCollection().remove(empleados);
                sucursalidSucursalOld = em.merge(sucursalidSucursalOld);
            }
            if (sucursalidSucursalNew != null && !sucursalidSucursalNew.equals(sucursalidSucursalOld)) {
                sucursalidSucursalNew.getEmpleadosCollection().add(empleados);
                sucursalidSucursalNew = em.merge(sucursalidSucursalNew);
            }
            if (puestoidPuestoOld != null && !puestoidPuestoOld.equals(puestoidPuestoNew)) {
                puestoidPuestoOld.getEmpleadosCollection().remove(empleados);
                puestoidPuestoOld = em.merge(puestoidPuestoOld);
            }
            if (puestoidPuestoNew != null && !puestoidPuestoNew.equals(puestoidPuestoOld)) {
                puestoidPuestoNew.getEmpleadosCollection().add(empleados);
                puestoidPuestoNew = em.merge(puestoidPuestoNew);
            }
            for (Pagossueldos pagossueldosCollectionNewPagossueldos : pagossueldosCollectionNew) {
                if (!pagossueldosCollectionOld.contains(pagossueldosCollectionNewPagossueldos)) {
                    Empleados oldEmpleadosidEmpleadosOfPagossueldosCollectionNewPagossueldos = pagossueldosCollectionNewPagossueldos.getEmpleadosidEmpleados();
                    pagossueldosCollectionNewPagossueldos.setEmpleadosidEmpleados(empleados);
                    pagossueldosCollectionNewPagossueldos = em.merge(pagossueldosCollectionNewPagossueldos);
                    if (oldEmpleadosidEmpleadosOfPagossueldosCollectionNewPagossueldos != null && !oldEmpleadosidEmpleadosOfPagossueldosCollectionNewPagossueldos.equals(empleados)) {
                        oldEmpleadosidEmpleadosOfPagossueldosCollectionNewPagossueldos.getPagossueldosCollection().remove(pagossueldosCollectionNewPagossueldos);
                        oldEmpleadosidEmpleadosOfPagossueldosCollectionNewPagossueldos = em.merge(oldEmpleadosidEmpleadosOfPagossueldosCollectionNewPagossueldos);
                    }
                }
            }
            for (Usuarios usuariosCollectionOldUsuarios : usuariosCollectionOld) {
                if (!usuariosCollectionNew.contains(usuariosCollectionOldUsuarios)) {
                    usuariosCollectionOldUsuarios.setEmpleadoidEmpleado(null);
                    usuariosCollectionOldUsuarios = em.merge(usuariosCollectionOldUsuarios);
                }
            }
            for (Usuarios usuariosCollectionNewUsuarios : usuariosCollectionNew) {
                if (!usuariosCollectionOld.contains(usuariosCollectionNewUsuarios)) {
                    Empleados oldEmpleadoidEmpleadoOfUsuariosCollectionNewUsuarios = usuariosCollectionNewUsuarios.getEmpleadoidEmpleado();
                    usuariosCollectionNewUsuarios.setEmpleadoidEmpleado(empleados);
                    usuariosCollectionNewUsuarios = em.merge(usuariosCollectionNewUsuarios);
                    if (oldEmpleadoidEmpleadoOfUsuariosCollectionNewUsuarios != null && !oldEmpleadoidEmpleadoOfUsuariosCollectionNewUsuarios.equals(empleados)) {
                        oldEmpleadoidEmpleadoOfUsuariosCollectionNewUsuarios.getUsuariosCollection().remove(usuariosCollectionNewUsuarios);
                        oldEmpleadoidEmpleadoOfUsuariosCollectionNewUsuarios = em.merge(oldEmpleadoidEmpleadoOfUsuariosCollectionNewUsuarios);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = empleados.getIdEmpleados();
                if (findEmpleados(id) == null) {
                    throw new NonexistentEntityException("The empleados with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Empleados empleados;
            try {
                empleados = em.getReference(Empleados.class, id);
                empleados.getIdEmpleados();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The empleados with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            Collection<Pagossueldos> pagossueldosCollectionOrphanCheck = empleados.getPagossueldosCollection();
            for (Pagossueldos pagossueldosCollectionOrphanCheckPagossueldos : pagossueldosCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Empleados (" + empleados + ") cannot be destroyed since the Pagossueldos " + pagossueldosCollectionOrphanCheckPagossueldos + " in its pagossueldosCollection field has a non-nullable empleadosidEmpleados field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Sucursales sucursalidSucursal = empleados.getSucursalidSucursal();
            if (sucursalidSucursal != null) {
                sucursalidSucursal.getEmpleadosCollection().remove(empleados);
                sucursalidSucursal = em.merge(sucursalidSucursal);
            }
            Puestos puestoidPuesto = empleados.getPuestoidPuesto();
            if (puestoidPuesto != null) {
                puestoidPuesto.getEmpleadosCollection().remove(empleados);
                puestoidPuesto = em.merge(puestoidPuesto);
            }
            Collection<Usuarios> usuariosCollection = empleados.getUsuariosCollection();
            for (Usuarios usuariosCollectionUsuarios : usuariosCollection) {
                usuariosCollectionUsuarios.setEmpleadoidEmpleado(null);
                usuariosCollectionUsuarios = em.merge(usuariosCollectionUsuarios);
            }
            em.remove(empleados);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Empleados> findEmpleadosEntities() {
        return findEmpleadosEntities(true, -1, -1);
    }

    public List<Empleados> findEmpleadosEntities(int maxResults, int firstResult) {
        return findEmpleadosEntities(false, maxResults, firstResult);
    }

    private List<Empleados> findEmpleadosEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Empleados.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Empleados findEmpleados(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Empleados.class, id);
        } finally {
            em.close();
        }
    }

    public int getEmpleadosCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Empleados> rt = cq.from(Empleados.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
